<template>
	<view>
		<view class="uni-header">
			<view class="uni-group">
				<view class="uni-title"></view>
				<view class="uni-sub-title"></view>
			</view>
			<view class="uni-group">
				<input class="uni-search" type="text" v-model="query" @confirm="search" placeholder="请输入订单号" />
				<button class="uni-button" type="default" size="mini" @click="search">搜索</button>
				<button class="uni-button" type="default" size="mini" :disabled="!selectedIndexs.length"
					@click="change(1,selectedData)">批量通过</button>
				<button class="uni-button" type="default" size="mini" :disabled="!selectedIndexs.length"
					@click="change(2,selectedData)">批量拒绝</button>
			</view>
		</view>
		<view class="uni-container">
			<unicloud-db ref="udb" :collection="collectionList"
				field="address,audit_status,goods_arr,preferential,notes,order_no,pay_date,total_fee,status,user_id.nickname as usname,out_trade_no,refund_fee,origstate,create_date,user_id._id as usid,transaction_id"
				:where="where || ('is_distr == true && status > 0 && status != 2 && status != 3 && status != 6')"
				page-data="replace" :orderby="orderby" :getcount="true" :page-size="options.pageSize"
				:page-current="options.pageCurrent" v-slot:default="{data,pagination,loading,error,options}"
				:options="options" loadtime="manual" @load="onqueryload">
				<uni-table ref="table" :loading="loading" :emptyText="error.message || '没有更多数据'" border stripe
					type="selection" @selection-change="selectionChange">
					<uni-tr>
						<uni-th align="center">购买用户</uni-th>
						<uni-th align="center" filter-type="select" :filter-data="options.filterData.status_localdata"
							@filter-change="filterChange($event, 'status')">订单状态</uni-th>
						<uni-th align="center" sortable @sort-change="sortChange($event, 'goods_arr')">购买的商品</uni-th>
						<uni-th align="center" filter-type="search" @filter-change="filterChange($event, 'order_no')"
							sortable @sort-change="sortChange($event, 'order_no')">订单号</uni-th>
						<uni-th align="center" filter-type="timestamp" @filter-change="filterChange($event, 'pay_date')"
							sortable @sort-change="sortChange($event, 'pay_date')">支付时间</uni-th>
						<uni-th align="center" filter-type="range" @filter-change="filterChange($event, 'total_fee')"
							sortable @sort-change="sortChange($event, 'total_fee')">支付金额</uni-th>
						<uni-th align="center" filter-type="range" @filter-change="filterChange($event, 'total_fee')"
							sortable @sort-change="sortChange($event, 'total_fee')">预估佣金</uni-th>
						<uni-th align="center">审核订单<text style="color: red;">（通过后佣金将直接结算给分销商）</text></uni-th>
					</uni-tr>
					<uni-tr v-for="(item,index) in data" :key="index">
						<uni-td align="center" style="text-align: left;">
							<view>用户昵称：{{item.usname[0]?item.usname[0]:'匿名用户'}}</view>
							<view>用户ID：{{item.usid[0]}}</view>
						</uni-td>
						<uni-td align="center"
							v-if="(item.status>0&&item.transaction_id) || (item.status<=0)">{{options.status_valuetotext[item.status]}}</uni-td>
						<uni-td align="center" style="color: #ff0000;" v-else>{{'虚假支付'}}</uni-td>
						<uni-td align="center" style="display: flex;flex-direction: row;">
							<view v-for="items in item.goods_arr">
								<uni-tooltip :content="items.goods_name">
									<image style="width: 100px;height: 100px;margin-left: 20px;" :src="items.goods_img">
									</image>
								</uni-tooltip>
							</view>
						</uni-td>
						<uni-td align="center">{{item.order_no}}</uni-td>
						<uni-td align="center">
							<uni-dateformat :threshold="[0, 0]" :date="item.pay_date"></uni-dateformat>
						</uni-td>
						<uni-td align="center">{{item.total_fee/100 + '元'}}</uni-td>
						<uni-td align="center">
							<view>{{'一级佣金：' + ((item.total_fee * (commpropo.one_pro/100))/100).toFixed(2) + '元'}}</view>
							<view>{{'二级佣金：' + ((item.total_fee * (commpropo.two_pro/100))/100).toFixed(2) + '元'}}</view>
							<view>{{'三级佣金：' + ((item.total_fee * (commpropo.three_pro/100))/100).toFixed(2) + '元'}}
							</view>
						</uni-td>
						<uni-td align="center">
							<view class="uni-group">
								<uni-data-checkbox v-if="item.audit_status == '未通过' || item.audit_status == '已通过'"
									style="display: flex;justify-content: center;" mode="button"
									:v-model="item.audit_status === '已通过' ? 1 : 2" :localdata="sex"
									:disabled="true"></uni-data-checkbox>
								<uni-data-checkbox v-else style="display: flex;justify-content: center;" mode="button"
									v-model="item.num" :localdata="sex"
									@change="change(item.num,[item._id])"></uni-data-checkbox>
							</view>
						</uni-td>
					</uni-tr>
				</uni-table>
				<view class="uni-pagination-box">
					<uni-pagination show-icon :page-size="pagination.size" v-model="pagination.current"
						:total="pagination.count" @change="onPageChanged" />
				</view>
			</unicloud-db>
		</view>
	</view>
</template>

<script>
	import {
		enumConverter,
		filterToWhere
	} from '../../js_sdk/validator/uni-pay-orders.js';

	const db = uniCloud.database()
	// 表查询配置
	const dbOrderBy = 'create_date desc' // 排序字段
	const dbSearchFields = ["order_no"] // 模糊搜索字段，支持模糊搜索的字段列表。联表查询格式: 主表字段名.副表字段名，例如用户表关联角色表 role.role_name
	// 分页配置
	const pageSize = 20
	const pageCurrent = 1

	const orderByMapping = {
		"ascending": "asc",
		"descending": "desc"
	}

	export default {
		data() {
			return {
				collectionList: "uni-pay-orders,uni-id-users",
				query: '',
				where: '',
				orderby: dbOrderBy,
				orderByFieldName: "",
				selectedData: [],
				selectedIndexs: [],
				sex: [{
					text: "通过",
					value: 1
				}, {
					text: "不通过",
					value: 2
				}],
				commpropo: [],
				options: {
					pageSize,
					pageCurrent,
					filterData: {
						"status_localdata": [{
								"text": "已关闭",
								"value": -1
							},
							{
								"text": "未支付",
								"value": 0
							},
							{
								"text": "已支付",
								"value": 1
							},
							{
								"text": "已部分退款",
								"value": 2
							},
							{
								"text": "已全额退款",
								"value": 3
							},
							{
								"text": "已发货",
								"value": 4
							},
							{
								"text": "待评价",
								"value": 5
							},
							{
								"text": "退款中",
								"value": 6
							},
							{
								"text": "已完成",
								"value": 7
							}
						]
					},
					...enumConverter
				},
				imageStyles: {
					width: 64,
					height: 64
				},
				exportExcel: {
					"filename": "uni-pay-orders.xls",
					"type": "xls",
					"fields": {
						"address": "address",
						"goods_arr": "goods_arr",
						"preferential": "preferential",
						"notes": "notes",
						"业务系统订单号": "order_no",
						"支付时间": "pay_date",
						"订单总金额": "total_fee",
						"订单状态": "status"
					}
				},
				exportExcelData: []
			}
		},
		onLoad() {
			this._filter = {}
			db.collection("jlg-distribution-propor").get().then((res) => {
				this.commpropo = res.result.data[0]
			})
		},
		onReady() {
			this.$refs.udb.loadData()
		},
		methods: {
			async change(num, id) {
				uni.showToast({
					title: '处理中',
					icon: 'loading',
					duration: 2000000
				});
				const updateOrder = async (index) => {
					if (index < id.length) {
						await db.collection("uni-pay-orders").doc(id[index]).update({
							"audit_status": num === 1 ? "已通过" : "未通过"
						});

						if (num === 1) {
							await this.superiorData(id[index]);
						}

						updateOrder(index + 1); // 调用下一个异步函数
					} else {
						// 循环结束后刷新页面
						setTimeout(() => {
							uni.hideToast();
							this.$nextTick(() => {
								this.loadData(); // 刷新页面
							});
						}, 500);
					}
				};

				const processSuperiorData = async (id) => {
					return new Promise((resolve, reject) => {
						this.superiorData(id)
							.then(() => {
								// 处理完成后解析Promise
								resolve();
							})
							.catch((error) => {
								// 处理出错时拒绝Promise
								reject(error);
							});
					});
				};

				updateOrder(0); // 调用递归函数，从第一个异步函数开始执行
			},
			superiorData(id) {
				return new Promise((resolve, reject) => {
					db.collection("uni-pay-orders").doc(id).get().then((res) => {
						let Newdata = res.result.data[0]
						db.collection("jlg-distribution").where({
							"user_arr": db.command.in([Newdata.user_id])
						}).get().then((res) => {
							if (res.result.data.length == 0) {
								// 未绑定分销商
								resolve(false);
							} else {
								// 上级分销商
								let oneuser = res.result.data[0].user_id;
								let records = res.result.data[0].records ? res.result.data[0]
									.records : [];
								let accu_comm = 0;
								let uodr_comm = 0;
								accu_comm = Math.floor(res.result.data[0].accu_comm + (Newdata
									.total_fee * (this.commpropo.one_pro / 100)));
								uodr_comm = Math.floor(res.result.data[0].uodr_comm + (Newdata
									.total_fee * (this.commpropo.one_pro / 100)));
								records.push({
									order: Newdata.order_no, //订单号
									user_id: Newdata.user_id, //用户id
									price: Math.floor(Newdata.total_fee * (this.commpropo
										.one_pro / 100)), //佣金金额
									grade: '一级成员贡献',
									time: Date.now(), //结算时间
								})
								db.collection("jlg-distribution").where({
									"user_id": oneuser
								}).update({
									"accu_comm": accu_comm,
									"uodr_comm": uodr_comm,
									"records": records,
								}).then(() => {
									db.collection("jlg-distribution").where({
										"user_arr": db.command.in([oneuser])
									}).get().then((res) => {
										if (res.result.data.length == 0) {
											resolve(false);
										} else {
											// 上上级分销商
											let twouser = res.result.data[0]
												.user_id
											let recordss = res.result.data[0]
												.records ? res.result.data[0]
												.records : [];
											let accu_comms = Math.floor(res.result
												.data[0].accu_comm + (Newdata
													.total_fee * (this
														.commpropo.two_pro /
														100)));
											let uodr_comms = Math.floor(res.result
												.data[0].uodr_comm + (Newdata
													.total_fee * (this
														.commpropo.two_pro /
														100)));
											recordss.push({
												order: Newdata
													.order_no, //订单号
												user_id: Newdata
													.user_id, //用户id
												price: Math.floor(Newdata
													.total_fee * (this
														.commpropo
														.two_pro / 100)
												), //佣金金额
												grade: '二级成员贡献',
												time: Date.now(), //结算时间
											})
											db.collection("jlg-distribution")
												.where({
													"user_id": twouser
												}).update({
													"accu_comm": accu_comms,
													"uodr_comm": uodr_comms,
													"records": recordss,
												}).then(() => {
													db.collection(
															"jlg-distribution")
														.where({
															"user_arr": db
																.command
																.in([
																	twouser
																])
														}).get().then((
															res) => {
															if (res.result
																.data
																.length ==
																0) {
																resolve(
																	false
																);
															} else {
																// 上上上级分销商
																let threeuser =
																	res
																	.result
																	.data[
																		0]
																	.user_id
																let recordsss =
																	res
																	.result
																	.data[
																		0]
																	.records ?
																	res
																	.result
																	.data[
																		0]
																	.records :
																	[];
																let accu_commss =
																	Math
																	.floor(
																		res
																		.result
																		.data[
																			0
																		]
																		.accu_comm +
																		(Newdata
																			.total_fee *
																			(this
																				.commpropo
																				.three_pro /
																				100
																			)
																		)
																	);
																let uodr_commss =
																	Math
																	.floor(
																		res
																		.result
																		.data[
																			0
																		]
																		.uodr_comm +
																		(Newdata
																			.total_fee *
																			(this
																				.commpropo
																				.three_pro /
																				100
																			)
																		)
																	);
																recordsss
																	.push({
																		order: Newdata
																			.order_no, //订单号
																		user_id: Newdata
																			.user_id, //用户id
																		price: Math
																			.floor(
																				Newdata
																				.total_fee *
																				(this
																					.commpropo
																					.three_pro /
																					100
																				)
																			), //佣金金额
																		grade: '三级成员贡献',
																		time: Date
																			.now(), //结算时间
																	})
																db.collection(
																		"jlg-distribution"
																	)
																	.where({
																		"user_id": threeuser
																	})
																	.update({
																		"accu_comm": accu_commss,
																		"uodr_comm": uodr_commss,
																		"records": recordsss,
																	})
																	.then(
																		() => {
																			resolve
																				();
																		})
																	.catch(
																		(
																			error
																		) => {
																			reject
																				(
																					error
																				);
																		});
															}
														})
												}).catch((
													error) => {
													reject(
														error
													);
												});
										}
									})
								}).catch((error) => {
									reject(error);
								});
							}
						})
					})
				})
			},
			onqueryload(data) {
				this.exportExcelData = data
			},
			getWhere() {
				const query = this.query.trim()
				if (!query) {
					return ''
				}
				const queryRe = new RegExp(query, 'i')
				return dbSearchFields.map(name => queryRe + '.test(' + name + ')').join(' || ')
			},
			search() {
				const newWhere = this.getWhere()
				this.where = newWhere
				this.$nextTick(() => {
					this.loadData()
				})
			},
			loadData(clear = true) {
				this.$refs.udb.loadData({
					clear
				})
			},
			onPageChanged(e) {
				this.selectedIndexs.length = 0
				this.$refs.table.clearSelection()
				this.$refs.udb.loadData({
					current: e.current
				})
			},
			navigateTo(url, clear) {
				// clear 表示刷新列表时是否清除页码，true 表示刷新并回到列表第 1 页，默认为 true
				uni.navigateTo({
					url,
					events: {
						refreshData: () => {
							this.loadData(clear)
						}
					}
				})
			},
			// 多选处理
			selectedItems() {
				const dataList = this.$refs.udb.dataList;
				return this.selectedIndexs.map((i) => {
					if (dataList[i].audit_status == "审核中") {
						return dataList[i]._id;
					}
				}).filter(Boolean); // 过滤掉可能的 undefined 值
			},
			// 多选
			selectionChange(e) {
				this.selectedIndexs = e.detail.index;
				this.selectedData = this.selectedItems();

				// 检查选中项是否符合条件
				const dataList = this.$refs.udb.dataList;
				const invalidIndexes = [];
				for (let i = 0; i < this.selectedIndexs.length; i++) {
					const index = this.selectedIndexs[i];
					if (dataList[index].audit_status !== "审核中") {
						invalidIndexes.push(index);
					}
				}

				// 给出提示
				if (invalidIndexes.length > 0) {
					this.selectedIndexs = []
					uni.showToast({
						title: "只能选择审核中的项",
						icon: "none",
						duration: 1600
					})
				}
			},
			confirmDelete(id) {
				this.$refs.udb.remove(id, {
					success: (res) => {
						this.$refs.table.clearSelection()
					}
				})
			},
			sortChange(e, name) {
				this.orderByFieldName = name;
				if (e.order) {
					this.orderby = name + ' ' + orderByMapping[e.order]
				} else {
					this.orderby = ''
				}
				this.$refs.table.clearSelection()
				this.$nextTick(() => {
					this.$refs.udb.loadData()
				})
			},
			filterChange(e, name) {
				this._filter[name] = {
					type: e.filterType,
					value: e.filter
				}
				let newWhere = filterToWhere(this._filter, db.command)
				if (Object.keys(newWhere).length) {
					this.where = newWhere
				} else {
					this.where = ''
				}
				this.$nextTick(() => {
					this.$refs.udb.loadData()
				})
			}
		}
	}
</script>

<style>
	.uni-buttons {
		color: #007aff;
		border: 1px solid #007aff;
	}

	.uni-buttonss {
		color: #e43d33;
		border: 1px solid #e43d33;
	}
</style>